package com.lncg.mapper;

import com.lncg.entity.CqzlDeviceReceiveData;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.util.List;

/**
 * CQZL设备接收数据Mapper接口
 * 
 * 提供CQZL设备数据的数据库操作功能，包括主表和历史表的数据访问。
 * 支持UPSERT操作和批量插入历史数据。
 * 
 * @author LNCG
 * @version 1.0.0
 * @since 2024-10-17
 */
@Mapper
public interface CqzlDeviceReceiveDataMapper {
    
    /**
     * 根据IMEI查询CQZL设备数据
     * 
     * @param imei 设备IMEI
     * @return CQZL设备数据，如果不存在则返回null
     */
    CqzlDeviceReceiveData findByImei(@Param("imei") String imei);
    
    /**
     * 插入CQZL设备数据到主表
     * 
     * @param deviceData CQZL设备数据
     * @return 影响行数
     */
    int insert(CqzlDeviceReceiveData deviceData);
    
    /**
     * 更新CQZL设备数据（基于IMEI）
     * 
     * @param deviceData CQZL设备数据
     * @return 影响行数
     */
    int updateByImei(CqzlDeviceReceiveData deviceData);
    
    /**
     * 插入CQZL设备数据到历史表
     * 
     * @param deviceData CQZL设备数据
     * @return 影响行数
     */
    int insertToHistory(CqzlDeviceReceiveData deviceData);
    
    /**
     * UPSERT操作：插入或更新CQZL设备数据（基于IMEI）
     * 
     * 如果IMEI对应的记录存在，则更新；如果不存在，则插入新记录。
     * 这是MySQL的ON DUPLICATE KEY UPDATE语法实现。
     * 
     * @param deviceData CQZL设备数据
     * @return 影响行数（插入返回1，更新返回2）
     */
    int upsertByImei(CqzlDeviceReceiveData deviceData);
    
    /**
     * 查询所有CQZL设备数据
     * 
     * @return CQZL设备数据列表
     */
    List<CqzlDeviceReceiveData> findAll();
    
    /**
     * 根据ID查询CQZL设备数据
     * 
     * @param id 设备数据ID
     * @return CQZL设备数据
     */
    CqzlDeviceReceiveData findById(@Param("id") Long id);
    
    /**
     * 根据IMEI删除CQZL设备数据
     * 
     * @param imei 设备IMEI
     * @return 影响行数
     */
    int deleteByImei(@Param("imei") String imei);
    
    /**
     * 批量插入CQZL设备数据到历史表
     * 
     * @param deviceDataList CQZL设备数据列表
     * @return 影响行数
     */
    int batchInsertToHistory(@Param("deviceDataList") List<CqzlDeviceReceiveData> deviceDataList);
    
    /**
     * 根据IMEI和接收时间查询记录
     * 
     * @param imei 设备IMEI
     * @param createTime 接收时间
     * @return CQZL设备数据
     */
    CqzlDeviceReceiveData findByImeiAndCreateTime(@Param("imei") String imei, @Param("createTime") String createTime);
    
    /**
     * 查询指定IMEI和接收时间之前的最新记录
     * 
     * @param imei 设备IMEI
     * @param createTime 接收时间
     * @return CQZL设备数据
     */
    CqzlDeviceReceiveData findLastRecordByImeiAndCreateTime(@Param("imei") String imei, @Param("createTime") String createTime);
    
    /**
     * 更新主表的zhengleiji字段
     * 
     * @param imei 设备IMEI
     * @param createTime 接收时间
     * @param zhengleiji 正累计值
     * @return 影响行数
     */
    int updateZhengleiji(@Param("imei") String imei, @Param("createTime") String createTime, @Param("zhengleiji") String zhengleiji);
    
    /**
     * 更新历史表的zhengleiji字段
     * 
     * @param imei 设备IMEI
     * @param createTime 接收时间
     * @param zhengleiji 正累计值
     * @return 影响行数
     */
    int updateZhengleijiInHistory(@Param("imei") String imei, @Param("createTime") String createTime, @Param("zhengleiji") String zhengleiji);
}
